package gtd;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.List;

public class Importacion {
    private Interfaz1 accesor;
    private final String rutaFichero;
    
    public Importacion(String ruta){
        accesor = new AccesoDatos();
        rutaFichero = ruta;
    }
    
    public boolean importar(){
        if(rutaFichero == null || rutaFichero.length() < 5){
            System.out.println("Error. Ruta/nombre de archivo demasiado corto.");
            return false;
        }
                
        // Recoge el substring resultante de empezar por los últimos 4 caracteres
        String extension = rutaFichero.substring(rutaFichero.length()-4);
        
        if(!extension.equals(".txt")){
            System.out.println("Error. Extensión de archivo no válida.");
            return false;
        }
        
        int idProyecto = 0;
        
        /* Obtiene el parseador de fechas y el tiempo transcurrido desde epoch
         * para cuando no se especifica una fecha inicial para una tarea o proyecto
         */
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        long tiempoEpoch = new java.util.Date().getTime();
        
        try{ 
            BufferedReader lector = new BufferedReader(new FileReader(rutaFichero));
            String linea;
            String[] campos;
            
            // En cada iteración lee una línea
            while( (linea = lector.readLine()) !=null){
                // Divide cada línea por campos delimitados por ;
                campos = linea.split(";");
                
                // Si el formato es correcto, deben ser 4 campos
                if(campos.length!=4){
                    System.out.println("Error. Formato de archivo no válido.");
                    return false;
                }
                
                // Si el primer campo no es P ni T, mal asunto...
                if(!campos[0].equals("P") && !campos[0].equals("T")){
                    System.out.println("Error. Formato de archivo no válido.");
                    return false;
                }
                
                // Extrae el nombre
                String nombre = campos[1].trim();
                
                /* Si la fecha de inicio está vacía, toma la fecha actual
                 * En caso contrario, la parsea suponiendo que tiene un formato dd/mm/aaaa
                 */
                Date fechaInicio;
                if(campos[2].equals(" "))
                    fechaInicio = new Date(tiempoEpoch);
                else{
                    long tiempo = formatter.parse(campos[2]).getTime();
                    fechaInicio = new Date(tiempo);
                }

                /* Si la fecha de fin está vacía, queda nula
                 * En caso contrario, la parsea suponiendo que tiene un formato dd/mm/aaaa
                 */
                Date fechaFinal = null;
                if(!campos[3].equals(" ")){
                    long tiempo = formatter.parse(campos[3]).getTime();
                    fechaFinal = new Date(tiempo);
                }
                
                // Si se trata de un proyecto, aumenta el ID asociado para las tareas
                switch (campos[0]) {
                    case "P":
                        idProyecto++;
                        accesor.anhadirProyecto(nombre, fechaInicio, fechaFinal);
                        break;
                    case "T":
                        accesor.anhadirTarea(nombre, idProyecto, fechaInicio, fechaFinal);
                        break;
                }

            }
                
            lector.close();
        } catch(Exception e){
            System.out.println(e.getMessage());
            return false;
        }
        
        return true;
    }

    public boolean exportar(){
        // Obtiene el parseador de fechas
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        
        try {
            FileWriter escritor = new FileWriter(rutaFichero);
 
            // Obtiene todos los proyectos
            List<ProyectoBean> proyectos = accesor.getListaProyectos();
            
            // Obtiene las tareas no asociadas a ningún proyecto
            List<TareaBean> tareas = accesor.filtrarTareas("idProyecto", "NULL");
            
            // Primero escribe las tareas sin proyecto asociado
            for(TareaBean t : tareas){
                // Parsea las fechas
                Date fechaInicio = t.getFechaInicio();
                Date fechaFinal = t.getFechaFinal();
                String strInicio = formatter.format(fechaInicio);
                String strFinal = " ";
                
                if(fechaFinal!=null)
                    strFinal = formatter.format(fechaFinal);
                escritor.write("T; " + t.getNombre() + "; " + strInicio + "; " + strFinal + "\n");
            }
            
            /* Para cada proyecto:
             * Parsea las fechas y escribe la línea en el fichero
             * Obtiene las tareas asociadas a dicho proyecto
             *      Para cada tarea asociada al proyecto:
             *      Parsea las fechas y escribe la línea en el fichero
             */
            for(ProyectoBean p : proyectos){
                int idProyecto = p.getId();
                Date fechaInicio = p.getFechaInicio();
                Date fechaFinal = p.getFechaFinal();
                String strInicio = formatter.format(fechaInicio);
                String strFinal = " ";
                
                if(fechaFinal!=null)
                    strFinal = formatter.format(fechaFinal);
                escritor.write("P; " + p.getNombre() + "; " + strInicio + "; " + strFinal + "\n");
                
                List<TareaBean> asociadas = accesor.filtrarTareas("idProyecto", idProyecto);
                for(TareaBean t : asociadas){
                    Date dateInicio = t.getFechaInicio();
                    Date dateFinal = t.getFechaFinal();
                    String stInicio = formatter.format(dateInicio);
                    String stFinal = " ";

                    if(fechaFinal!=null)
                        stFinal = formatter.format(dateFinal);
                    escritor.write("T; " + t.getNombre() + "; " + stInicio + "; " + stFinal + "\n");
                }
            }
            
            escritor.close();
        } catch(IOException e){
            System.out.println(e.getMessage());
            return false;
        }
        
        return true;
    }
}
